#继承与多态
#工资结算系统：经理每月固定15000，程序员月工作小时*150，销售员1200+销售额5%
#abc 模块（Abstract Base Classes）是 Python 标准库中的一个模块，主要用于创建和使用抽象基类。
#abstractmethod是抽象方法，子类必须实现
from abc import ABCMeta, abstractmethod
#metaclass=ABCMeta，继承元类，进而创建为抽象基类
class Employee(metaclass=ABCMeta):
    def __init__(self,name) -> None:
        self._name=name
    @property
    def name(self):
        return self._name
    #声明为抽象方法，不需要实现
    @abstractmethod
    def get_salary(self):
        pass
class Manager(Employee):
    def get_salary(self):
        return 15000
class Programmer(Employee):
    def __init__(self, name,working_hour=0) -> None:
        super().__init__(name)
        self._working_hour=working_hour
    @property 
    def working_hour(self):
        return self._working_hour
    @working_hour.setter
    def working_hour(self,working_hour):
        #python的独特三元表达式
        self._working_hour=working_hour if working_hour>0 else 0
    def get_salary(self):
        return self._working_hour*20
class Salesman(Employee):
    def __init__(self, name,sales=0) -> None:
        super().__init__(name)
        self._sales=sales
    @property
    def sales(self):
        return self._sales
    @sales.setter
    def sales(self,sales):
        self._sales=sales
    def get_salary(self):
        return 1200+self._sales*0.05
def main():
    p1=Manager("朝十晚五经理")
    p2=Programmer("996吗喽",312)
    p3=Salesman("社牛销售",10000)
    print(f"{p1.name}，本月工资：{p1.get_salary()}")
    print(f"{p2.name}，本月工资：{p2.get_salary()}")
    print(f"{p3.name}，本月工资：{p3.get_salary()}")
if __name__=="__main__":
    main()